<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Ranges | Elasticsearch: The Definitive Guide [2.x] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch: The Definitive Guide [2.x]">
<link rel="up" href="structured-search.html" title="Structured Search">
<link rel="prev" href="_finding_multiple_exact_values.html" title="Finding Multiple Exact Values">
<link rel="next" href="_dealing_with_null_values.html" title="Dealing with Null Values">
<meta name="DC.type" content="Learn/Docs/Legacy/Elasticsearch/Definitive Guide/2.x">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="2.x">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<p>
  <strong>WARNING</strong>: The 2.x versions of Elasticsearch have passed their
  <a href="https://www.elastic.co/support/eol">EOL dates</a>. If you are running
  a 2.x version, we strongly advise you to upgrade.
</p>
<p>
  This documentation is no longer maintained and may be removed. For the latest
  information, see the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html">current
  Elasticsearch documentation</a>.
</p>
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: The Definitive Guide [2.x]</a></span>
»
<span class="breadcrumb-link"><a href="search-in-depth.html">Search in Depth</a></span>
»
<span class="breadcrumb-link"><a href="structured-search.html">Structured Search</a></span>
»
<span class="breadcrumb-node">Ranges</span>
</div>
<div class="navheader">
<span class="prev">
<a href="_finding_multiple_exact_values.html">« Finding Multiple Exact Values</a>
</span>
<span class="next">
<a href="_dealing_with_null_values.html">Dealing with Null Values »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="_ranges"></a>Ranges<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/080_Structured_Search/25_ranges.asciidoc">edit</a>
</h2>
</div></div></div>
<p>When dealing with numbers in this chapter, we have so far searched for only
exact numbers.  In practice,  filtering on ranges is often more useful.  For
example, you might want to find all products with a price greater than $20 and less than $40.</p>
<p>In SQL terms, a range can be expressed as follows:</p>
<div class="pre_wrapper lang-sql">
<pre class="programlisting prettyprint lang-sql">SELECT document
FROM   products
WHERE  price BETWEEN 20 AND 40</pre>
</div>
<p>Elasticsearch has a <code class="literal">range</code> query, which, unsurprisingly,
can be used to find documents falling inside a range:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"range" : {
    "price" : {
        "gt" : 20,
        "lt" : 40
    }
}</pre>
</div>
<p>The <code class="literal">range</code> query supports both inclusive and exclusive ranges, through
combinations of the following options:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">gt</code>: <code class="literal">&gt;</code> greater than
</li>
<li class="listitem">
<code class="literal">lt</code>: <code class="literal">&lt;</code> less than
</li>
<li class="listitem">
<code class="literal">gte</code>: <code class="literal">&gt;=</code> greater than or equal to
</li>
<li class="listitem">
<code class="literal">lte</code>: <code class="literal">&lt;=</code> less than or equal to
</li>
</ul>
</div>
<p><strong>Here is an example range query:</strong></p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /my_store/products/_search
{
    "query" : {
        "constant_score" : {
            "filter" : {
                "range" : {
                    "price" : {
                        "gte" : 20,
                        "lt"  : 40
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/080_Structured_Search/25_Range_filter.json"></div>
<p>If you need an unbounded range (for example, just &gt;20), omit one of the
boundaries:</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">"range" : {
    "price" : {
        "gt" : 20
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/080_Structured_Search/25_Range_filter.json"></div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_ranges_on_dates"></a>Ranges on Dates<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/080_Structured_Search/25_ranges.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">range</code> query can be used on date fields too:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"range" : {
    "timestamp" : {
        "gt" : "2014-01-01 00:00:00",
        "lt" : "2014-01-07 00:00:00"
    }
}</pre>
</div>
<p>When used on date fields, the <code class="literal">range</code> query supports <em>date math</em> operations.
For example, if we want to find all documents that have a timestamp sometime
in the last hour:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"range" : {
    "timestamp" : {
        "gt" : "now-1h"
    }
}</pre>
</div>
<p>This filter will now constantly find all documents with a timestamp greater
than the current time minus 1 hour, making the filter a <em>sliding window</em>
across your documents.</p>
<p>Date math can also be applied to actual dates, rather than a placeholder like
now. Just add a double pipe (<code class="literal">||</code>) after the date and follow it with a date
math expression:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"range" : {
    "timestamp" : {
        "gt" : "2014-01-01 00:00:00",
        "lt" : "2014-01-01 00:00:00||+1M" <a id="CO52-1"></a><i class="conum" data-value="1"></i>
    }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO52-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>Less than January 1, 2014 plus one month</p>
</td>
</tr>
</table>
</div>
<p>Date math is <em>calendar aware</em>, so it knows the number of days in each month,
days in a year, and so forth.  More details about working with dates can be found in
the <a href="/guide/en/elasticsearch/reference/2.4/mapping-date-format.html" class="ulink" target="_top">date format reference documentation</a>.</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_ranges_on_strings"></a>Ranges on Strings<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/080_Structured_Search/25_ranges.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">range</code> query can also operate on string fields.
  String ranges are
calculated <em>lexicographically</em>  or alphabetically.  For example, these values
are sorted in lexicographic order:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
5, 50, 6, B, C, a, ab, abb, abc, b
</li>
</ul>
</div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>Terms in the inverted index are sorted in lexicographical order, which is why
string ranges use this order.</p>
</div>
</div>
<p>If we want a range from <code class="literal">a</code> up to but not including <code class="literal">b</code>, we can use the same
<code class="literal">range</code> query syntax:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"range" : {
    "title" : {
        "gte" : "a",
        "lt" :  "b"
    }
}</pre>
</div>
<div class="sidebar">
<div class="titlepage"><div><div>
<p class="title"><strong>Be Careful of Cardinality</strong></p>
</div></div></div>
<p>Numeric and date fields are indexed in such a way that ranges are efficient
to calculate.  This is not the case for string fields, however.  To perform
a range on a string field, Elasticsearch is effectively performing a <code class="literal">term</code>
filter for every term that falls in the range.  This is much slower than
a date or numeric range.</p>
<p>String ranges are fine on a field with <em>low cardinality</em>—a small number of
unique terms.  But the more unique terms you have, the slower the string range
will be.</p>
</div>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="_finding_multiple_exact_values.html">« Finding Multiple Exact Values</a>
</span>
<span class="next">
<a href="_dealing_with_null_values.html">Dealing with Null Values »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
